Skip to content

fix: Argon skin corruption + ppy cherry-pick + surface format + safe-mode shader wipe - #343

Merged
winnerspiros merged 7 commits into
masterfrom
copilot/fix-ui-issues-vulkan-crash
May 21, 2026
Merged

fix: Argon skin corruption + ppy cherry-pick + surface format + safe-mode shader wipe#343
winnerspiros merged 7 commits into
masterfrom
copilot/fix-ui-issues-vulkan-crash

Conversation

Copilot AI commented May 19, 2026

Copy link
Copy Markdown
  • Investigate CI failures
  • Identify TestFruitColourFallback root cause: TestSkin had no resources → hasPear=false → DefaultFruitPiece used instead of LegacyFruitPiece
  • Fix TestSkin to implement IStorageResourceProvider and use DefaultLegacySkin's NamespacedResourceStore (hasPear=true → LegacyFruitPiece)
  • Restore TestCustomCatcherColour test (accidentally removed in prior fix)
  • Fix iOS CI workflow: resolve REAL_SDK to canonical path to prevent ELOOP symlink errors

…mode shader wipe

Changes:
- Cherry-pick ppy editor toolbox icons commit: new OsuIcon entries (EditorHit,
  EditorDrumRoll, EditorSwell, EditorFruit, EditorJuiceStream, EditorBananaShower,
  EditorNote, EditorHoldNote) and all 8 composition tools updated to use SpriteIcon
  instead of BeatmapStatisticIcon. Bump osu-resources to 2026.519.0.
- Fix Argon skin visual corruption (white circles, off-hue TrianglesV2 on buttons):
  Force-wipe the shader pipeline cache in ForceOpenGLRendererIfSafeMode(). When a
  Vulkan session dies mid-compile (ANR), the shader cache sentinel is already marked
  'done for v241' but partial/misaligned SPIR-V blobs remain on disk. The rescue
  OpenGL session then picks up these stale shaders which were compiled against the
  old GlobalUniformData layout (pre-UniformPadding12 alignment fix). Result: the
  masking uniform (CornerRadius clip) and gradient colour uniform are read from wrong
  struct offsets → Argon hit circles appear as white squares, button TrianglesV2
  shows wrong hues. Wiping unconditionally on every safe-mode entry fixes this.
- Make pre-SDL Window.SetFormat(RGBA8888) unconditional (remove IsVulkanConfigured
  guard). Ensures 32-bit colour in both Vulkan and OpenGL modes; prevents an RGB565
  initial surface allocation that causes colour-channel artefacts in early frames of
  the OpenGL rescue session.

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/aff86d54-a6b0-494c-b672-682c2bfbd9ff

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
@gitar-bot

gitar-bot Bot commented May 19, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/ad643f8c-cd6e-4da3-b81a-5821e16c4552

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
…per-dash colour tests

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/4ce2919b-353e-4a49-9712-a665dd5f72a9

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
…itExplosion null Drawable, fix iOS xcode-select

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/04bea131-bdfb-4c81-8a1a-dbba5215f82e

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Copilot AI requested a review from winnerspiros May 20, 2026 17:53
Comment thread osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs Fixed
Comment thread osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs Fixed
Comment thread osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs Fixed
Comment thread osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs Fixed
…le properly nullable

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/f25219ac-7425-4cf9-b931-f7cf70266b1d

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Copilot AI requested a review from winnerspiros May 21, 2026 04:10
…sources (hasPear=true)

TestSkin was using null resource store, causing CatchLegacySkinTransformer
to see hasPear=false and return null for the fruit component. This caused
SkinnableDrawable to fall back to DefaultFruitPiece, which always uses
DEFAULT_HYPER_DASH_COLOUR regardless of skin config.

Fix: implement IStorageResourceProvider in the test scene and pass it to
TestSkin, which now uses a NamespacedResourceStore pointing to the built-in
legacy skin assets (Skins/Legacy). This makes hasPear=true, returning
LegacyFruitPiece, which correctly reads hyper-dash colours from skin config.

Also fix iOS CI workflow: resolve MacOSX.sdk symlink target to its canonical
path (via python3 os.path.realpath) to prevent ELOOP (too many symlink levels)
when the symlink target is itself a symlink chain.

Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/18bebe86-a7b2-4d08-815c-3cad3370ec69

Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Copilot AI requested a review from winnerspiros May 21, 2026 05:05
@winnerspiros
winnerspiros marked this pull request as ready for review May 21, 2026 05:26
Copilot AI review requested due to automatic review settings May 21, 2026 05:26
@winnerspiros
winnerspiros merged commit 76887f6 into master May 21, 2026
14 of 22 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Updates framework dependencies and editor UI icons, while adding Android stability mitigations and adjusting CI Xcode selection for updated .NET iOS tooling.

Changes:

  • Bump ppy.osu.Framework (and mobile variants) to 2026.520.3, and update ppy.osu.Game.Resources.
  • Add new editor icon mappings and switch multiple ruleset composition tools to use OsuIcon-based SpriteIcons.
  • Add Android Vulkan ANR mitigation (OnPause watchdog) + safe-mode shader-cache wipe, and update CI to select Xcode 26.5.

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
osu.iOS.props Bumps iOS framework package version.
osu.Game/osu.Game.csproj Bumps framework package, updates referenced version in comment, bumps resources package.
osu.Game/Graphics/OsuIcon.cs Adds new editor icon public accessors + enum mappings for new glyphs.
osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs Makes skinnable nullable and guards lifetime accessors.
osu.Game.Rulesets.Taiko/Edit/SwellCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Taiko/Edit/HitCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Taiko/Edit/DrumRollCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Mania/Edit/NoteCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Mania/Edit/HoldNoteCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Catch/Edit/JuiceStreamCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Catch/Edit/FruitCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Catch/Edit/BananaShowerCompositionTool.cs Switches tool icon to SpriteIcon using new OsuIcon.
osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs Updates test skin to use storage/resource plumbing via IStorageResourceProvider.
osu.Android/OsuGameActivity.cs Improves window format setup comments and adds Vulkan-only OnPause watchdog to avoid ANRs.
osu.Android/LogManagement.cs Wipes shader cache on safe-mode OpenGL rescue path to avoid corruption after interrupted Vulkan compile.
osu.Android.props Bumps Android framework package version.
.github/workflows/ci.yml Updates Xcode pinning logic to 26.5 and symlinks real macOS SDK into the active Xcode.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +999 to +1032
if (LogManagement.IsVulkanConfigured())
{
var pauseCompleted = new ManualResetEventSlim(false);

ThreadPool.QueueUserWorkItem(_ =>
{
const int watchdog_ms = 7000;

if (pauseCompleted.Wait(watchdog_ms))
return;

// base.OnPause() has not returned — draw thread is conclusively stuck in
// vkQueuePresentKHR. Write a diagnostic marker and kill cleanly.
try
{
CrashDiagnostics.WriteAliveMarker(
$"OnPause watchdog fired after {watchdog_ms}ms: draw thread stuck in vkQueuePresentKHR (Vulkan IMMEDIATE ANR). Killing for clean restart.");
}
catch { }

try
{
Debug.WriteLine(
"[osu!] OnPause watchdog: draw thread stuck in vkQueuePresentKHR >7s — killing for clean Vulkan restart.");
}
catch { }

try { global::Android.OS.Process.KillProcess(global::Android.OS.Process.MyPid()); }
catch { }
});

base.OnPause();
pauseCompleted.Set();
}
Comment on lines +230 to +235
IRenderer IStorageResourceProvider.Renderer => host.Renderer;
AudioManager IStorageResourceProvider.AudioManager => Audio;
IResourceStore<byte[]> IStorageResourceProvider.Files => null!;
IResourceStore<byte[]> IStorageResourceProvider.Resources => base.Resources;
IResourceStore<TextureUpload> IStorageResourceProvider.CreateTextureLoaderStore(IResourceStore<byte[]> underlyingStore) => host.CreateTextureLoaderStore(underlyingStore);
RealmAccess IStorageResourceProvider.RealmAccess => null!;
Comment on lines +435 to +443
[Description(@"Editor/banana-shower")]
EditorBananaShower,

[Description(@"Editor/note")]
EditorNote,

[Description(@"Editor/hold-note")]
EditorHoldNote,

Comment thread .github/workflows/ci.yml
Comment on lines +316 to +322
# Switch to preferred Xcode if it exists, otherwise the one that has the real SDK.
if [ -d "$PREFERRED_XCODE" ]; then
sudo xcode-select -switch "$PREFERRED_XCODE"
elif [ -n "$REAL_XCODE" ]; then
sudo xcode-select -switch "$REAL_XCODE"
echo "Note: Xcode_26.5.app not found; using $REAL_XCODE for xcode-select"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants